package br.com.foxinline.manager.acao;

import br.com.foxinline.enums.CategoriaPessoa;
import br.com.foxinline.enums.TipoPessoa;
import br.com.foxinline.modelo.*;
import br.com.foxinline.servico.*;
import br.com.foxinline.utilitario.Caracteres;
import br.com.foxinline.utilitario.Mensagem;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import org.primefaces.context.RequestContext;

/**
 *
 * @author cadomeireles
 */
@ViewScoped
@ManagedBean
public class ManagerTransferenciaImovel implements Serializable {
    
    @EJB
    ImovelServico imovelServico;
    @EJB
    TransferenciaServico transferenciaServico;
    @EJB
    CidadeServico cidadeServico;
    @EJB
    PessoaServico pessoaServico;    
    @EJB
    TituloServico tituloServico;
    @EJB
    BairroServico bairroServico;
    @EJB
    RegistroServico registroServico;
    
    private Imovel imovel;
    
    private Transferencia transferenciaAtual;
    private Transferencia novaTransferencia;
    
    private Registro registro;
    
    private List<Pessoa> transmitentesAtuais;
    private List<Pessoa> adquirentesAtuais;
    
    private Pessoa adquirentePesquisar;
    private Pessoa adquirenteSelecionado;
    private List<Pessoa> adquirentes;
    private Pessoa adquirenteCadastrar;
    private List<Pessoa> adquirentesSelecionados;
    
    String imovelId;
    
    @PostConstruct
    public void init() {
        Map<String, String> parametros = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
        this.imovelId = parametros.get("imovelId");
        
        if (imovelId != null) {
            this.imovel = imovelServico.pesquisar(Long.parseLong(imovelId));
        }

        this.registro = new Registro();
        
        this.novaTransferencia = new Transferencia();

        this.transferenciaAtual = transferenciaServico.obterTransferenciaAtual(this.imovel);        
        this.transmitentesAtuais = transferenciaServico.pesquisarTransmitentes(this.transferenciaAtual);        
        this.adquirentesAtuais = transferenciaServico.pesquisarAdquirentes(this.transferenciaAtual);

        instanciarAdquirentePesquisar();
        this.adquirentesSelecionados = new ArrayList<Pessoa>();

        Integer ultimoRegistro = imovelServico.obterUltimoNumeroRegistro(this.imovel);
        Integer ultimoAverbacao = imovelServico.obterUltimoNumeroAverbacao(this.imovel);
        
        this.registro.setNumero((ultimoRegistro > ultimoAverbacao ? ultimoRegistro : ultimoAverbacao) + 1);
        
        instanciarAdquirenteCadastrar();
    }

    public void instanciarAdquirentePesquisar() {
        this.adquirentePesquisar = new Pessoa();
        this.adquirentePesquisar.setTipoPessoa(TipoPessoa.FISICA);

        this.adquirenteSelecionado = new Pessoa();

        this.adquirentes = new ArrayList<Pessoa>();
    }    

    public void instanciarAdquirenteCadastrar() {
        this.adquirenteCadastrar = new Pessoa();
        this.adquirenteCadastrar.setTipoPessoa(TipoPessoa.FISICA);
        this.adquirenteCadastrar.setEndereco(new Endereco());
    }    
    
    public void removerAdquirente(Pessoa adquirente) {
        this.adquirentesSelecionados.remove(adquirente);
    }
    
    public void limparAdquirente() {
        this.adquirentePesquisar.setNome(null);
        this.adquirentePesquisar.setCpf(null);
        this.adquirentePesquisar.setCnpj(null);
        this.adquirentes = new ArrayList<Pessoa>();
    }
    
    public void pesquisarAdquirente() {
        this.adquirentes = pessoaServico.pesquisarCliente(this.adquirentePesquisar, this.adquirentesAtuais, this.adquirentesSelecionados);
    }    
    
    public void selecionarAdquirente() {

        if (this.adquirenteSelecionado.getId() != null) {
            this.adquirentesSelecionados.add(this.adquirenteSelecionado);        
            instanciarAdquirentePesquisar();
            
            RequestContext requestContext = RequestContext.getCurrentInstance(); 
            requestContext.execute("dialogAdquirente.hide()");
        }       

    }    

    public void salvarAdquirente() {
        this.adquirenteCadastrar.setCategoriaPessoa(CategoriaPessoa.CLIENTE);

        if (this.adquirenteCadastrar.getTipoPessoa() == TipoPessoa.FISICA) {
            this.adquirenteCadastrar.setCpf(Caracteres.removecaracter(this.adquirenteCadastrar.getCpf()));
        } else {
            this.adquirenteCadastrar.setCnpj(Caracteres.removecaracter(this.adquirenteCadastrar.getCnpj()));
        }

        this.adquirenteCadastrar.getEndereco().setCep(Caracteres.removecaracter(this.adquirenteCadastrar.getEndereco().getCep()));

        pessoaServico.salvar(this.adquirenteCadastrar);

        this.adquirentesSelecionados.add(this.adquirenteCadastrar);

        instanciarAdquirenteCadastrar();

        RequestContext requestContext = RequestContext.getCurrentInstance(); 
        requestContext.execute("dialogAdquirente.hide()");
    }
    
    public void transferir() {
        // desativar a última transferência
        this.transferenciaAtual.setAtual(false);
        transferenciaServico.atualizar(this.transferenciaAtual);

        // salvar a nova transferência, que passa a ser a atual
        this.novaTransferencia.setImovel(this.imovel);
        this.novaTransferencia.setTransmitente(this.adquirentesAtuais);
        this.novaTransferencia.setAdquirente(this.adquirentesSelecionados);
        this.novaTransferencia.setAtual(true);
        transferenciaServico.salvar(this.novaTransferencia);

        // salvar registro
        this.registro.setTransferencia(this.novaTransferencia);
        registroServico.salvar(this.registro);

        // adicionar registro ao imóvel
        this.imovel.getRegistros().add(this.registro);
        imovelServico.atualizar(this.imovel);

        init();

        Mensagem.messagemInfo("Transferência realizada com sucesso!");
    }
    
    public String adicionarMascaraCNPJ(String string) {
        return  Caracteres.adicionarMascara(string, Caracteres.cnpjMask);
    }

    public String adicionarMascaraCPF(String string) {
        return  Caracteres.adicionarMascara(string, Caracteres.cpfMask);
    }
    
    public List<Cidade> autocompletarCidade(String query) {
        return cidadeServico.autocompletar(query);
    }
    
    public List<Titulo> autocompletarTitulo(String query) {
        return tituloServico.autocompletar(query);
    }    
    
    public List<Bairro> autocompletarBairro(String query) {
        return bairroServico.autocompletar(query, this.adquirenteCadastrar.getEndereco().getCidade());
    }    
    
    public Imovel getImovel() {
        return imovel;
    }

    public void setImovel(Imovel imovel) {
        this.imovel = imovel;
    }

    public Transferencia getNovaTransferencia() {
        return novaTransferencia;
    }

    public void setNovaTransferencia(Transferencia novaTransferencia) {
        this.novaTransferencia = novaTransferencia;
    }

    public Transferencia getTransferenciaAtual() {
        return transferenciaAtual;
    }

    public void setTransferenciaAtual(Transferencia transferenciaAtual) {
        this.transferenciaAtual = transferenciaAtual;
    }

    public List<Pessoa> getAdquirentesAtuais() {
        return adquirentesAtuais;
    }

    public void setAdquirentesAtuais(List<Pessoa> adquirentesAtuais) {
        this.adquirentesAtuais = adquirentesAtuais;
    }

    public List<Pessoa> getTransmitentesAtuais() {
        return transmitentesAtuais;
    }

    public void setTransmitentesAtuais(List<Pessoa> transmitentesAtuais) {
        this.transmitentesAtuais = transmitentesAtuais;
    }

    public Pessoa getAdquirenteCadastrar() {
        return adquirenteCadastrar;
    }

    public void setAdquirenteCadastrar(Pessoa adquirenteCadastrar) {
        this.adquirenteCadastrar = adquirenteCadastrar;
    }

    public Pessoa getAdquirentePesquisar() {
        return adquirentePesquisar;
    }

    public void setAdquirentePesquisar(Pessoa adquirentePesquisar) {
        this.adquirentePesquisar = adquirentePesquisar;
    }

    public Pessoa getAdquirenteSelecionado() {
        return adquirenteSelecionado;
    }

    public void setAdquirenteSelecionado(Pessoa adquirenteSelecionado) {
        this.adquirenteSelecionado = adquirenteSelecionado;
    }

    public List<Pessoa> getAdquirentes() {
        return adquirentes;
    }

    public void setAdquirentes(List<Pessoa> adquirentes) {
        this.adquirentes = adquirentes;
    }

    public List<Pessoa> getAdquirentesSelecionados() {
        return adquirentesSelecionados;
    }

    public void setAdquirentesSelecionados(List<Pessoa> adquirentesSelecionados) {
        this.adquirentesSelecionados = adquirentesSelecionados;
    }

    public Registro getRegistro() {
        return registro;
    }

    public void setRegistro(Registro registro) {
        this.registro = registro;
    }

}
